各位支付学员的同学,大家好,教导主任今天的内容,是由 Ping++ 高级技术总监——叶波光老师带来的《支付系统架构详述》。本篇内容由五个部分组成。接下来我们开始上课!
架构的定义:架构一定是基于业务功能来展开的,主要是制定技术规范、框架,指导系统落地,好的架构是需要不断演变和进化而来的。
架构需要关注的基础核心点主要是:安全、稳定、可扩展。
构建架构时需要关注的点:目标客户是谁;主要场景有哪些;流程是怎样的;模型、职责有哪些;边界在哪里以及设计。其中比较难以理解的点是困难及模型这两块。
架构与业务需求的关系:架构的产生来自于业务需求,业务需求进一步抽象形成架构,架构指导后续研发,研发最终成果解决业务需求的问题。整体是一个正向循环的关系。
支付架构
支付流程分析
第一步,用户选择支付渠道,进入商户客户端;第二步,商户客户端发送支付要素,到商户服务端;第三步,商户服务端发起支付请求到渠道侧(个别渠道如支付宝不需要此步骤);第四步,渠道返回支付凭证到商户服务端;第五步,商户服务端返回支付凭证到商户客户端;第六步,用户调用支付宝控件完成支付。
接下来是重点,第七步一般渠道是采用异步通知方法来通知商户,但是有些企业是在第六步支付完成之后,在C端会同步通知支付成功。如果以此结果来判断支付是否成功,其实是不严谨会出问题的,应当调用渠道的支付接口来进行核查,然后以渠道返回的结果为准。
在日常工作中,许多企业在选择第四方服务商或者渠道的时候,会着重关注并发这个点,认为并发量需要达到上万级才可以满足日常需求,但实际上并没有必要的。
若直接对接渠道可能会遇到的问题:
接口文档升级、变更能及时得到通知
有些业务没有异步通知
同一业务在不同渠道表现不一样
各种渠道的各自异常
商户的要求:
清晰的 API 、SDK 文档
安全
所有应用接口统一标准的异步通知
保证出口 IP 稳定(安全)
在系统架构设计时需要注意的一些要点:
提供规范的 API、SDK
安全(通讯安全、数据安全)
稳定
异步通知统一
各渠道的异常
及时了解渠道接口调整
(以 Ping++ 的 API 接口设计规范为例)
支付核心逻辑
这里讲一下支付成功之后,我们会把订单信息同步到财务系统,在账务系统里我们设计了诸如转账、汇款等功能,在前期设计时会生成账务的规则,例如一笔支付的请求会生成多笔账务,对其字段进行区分,这样方便管理和维护。
支付网关
此处特指API网关,支付网关的功能:
限流最好不要放到业务流程中做,会影响用户的体验。
支付网关的功能:
唯一的请求入口
统一的身份认证、签名、加解密、流控
API 调用计费
API 的监控、报警分析
API 发布管理
熔断
API 聚合
协议转换
上述内容除了必要以外,其他不放在业务层做,也是为了更好的用户体验。
支付逻辑
主要是根据请求的参数进行静态检验和业务逻辑校验,避免系统异常
适配渠道的参数校验:长度、类型、格式
订单的支付状态:是否支付
订单的有效期等等
要点:
一般商户是不需要做支付路由,大部分都是指定了最终的某个支付渠道。
但也有些没有指定了某个最终的渠道,比如银行卡的支付可以选择哪个第三方支付来完成支付,还有微信线上线下的封装,这个时候就涉及到支付路由
规则配置
费率:单笔费率、总额费率、阶梯费率
营销活动:固定时间单笔优惠、单笔满减、直接补贴
额度限制:单笔额度、时间范围内总额度
服务指标:失败率、平均响应时间、异常率、TPS
特殊配置:特殊要求(比如某渠道能快速结算)
支付网关的目的:
省 钱
支付风控
要点:梳理清楚业务风险,分析风险原因,制定风险防范规则。
风控的结果:拒绝、放行、增强认证
系统的要求:灵活稳定、高性能、准确性
数据来源:
内部数据:
• 用(商)户信息
• 交易数据
• 账户数据
• 黑名单
• 设备、位置信息
• 日志数据
外部数据:
• 第三方购买
• 央行征信
• 芝麻信用
• ...
• 合作数据
风控流程:
事前:
入网审核
风险评估
单笔限额设置
单日限额设置
频次设置
事中:
实时分析
多维度判断
拒绝
拦截 - 进一步验证
- 人工介入
延迟操作(例如用户大额提现,需要时间段进行复核)
事后:
数据分析
巡查、警告
降低评级
升级防范措施
逻辑完善
反馈至事前、事中规则中
账务系统
账务生成
内部对账
原始账单下载
生成标准账单
对账
差错处理
账务生成后首先进行内部对账,然后进行原始账单下载,再生成标准账单,进行对账之后进行差错处理。
内部流程如图:
订阅交易信息
根据交易事件查询生成账务的规则
交易事件:支付、退款、转账等等
根据规则生成账务明细
将账务明细落地
对账流程(实现方式之一)
内部对账:
保证账务和交易信息配对
一条交易信息有多条账务信息
渠道账单下载:
下载
账单标准化(对账字段统一)
落地标准化账单
对账:
账务和标准账单对账
双向对账
差错处理
账单下载:
这里提一句,在做异常处理这部分工作时,有的研发朋友写代码时遇到过类似的问题,例如订单在周末下单,但账单周一才能查询;等到周一时发现查询不到,选择立即重试 + X 分钟后重试就结束了。这样是不行的,因为银行有的是 8 点之后可以查询到,有的是 9 点之后,所以要选择递增时间重试,然后标记人工处理。
对账:
差错处理
本地丢失:渠道账单的数据未在账务中查找到。
渠道丢失:账务中的数据未在渠道账单中查找到。
数据差错:账务与渠道某些对账字段未能对上。
此处需要注意的是——
针对差错都需要向渠道查询每笔订单信息,再次确认。
同时:有些渠道的交易成功时间本来就是有错误的。一般来说时间不会差错很大,一般出现在跨日交易中。例如当天交易无账单,先标记为差错,第二天再改正。
支付基础服务
Webhook
公共推送服务
主动查询
补偿
链路监控
Webhook
公共推送服务
主动查询
异步延时调用
场景:
1、订单创建成功的时候会向服务推送主动查询信息,如果订单支付成功会通知服务取消后续的主动查询,否则在过期时间点向渠道主动查询订单是否支付。目的是避免渠道异步通知服务的异常。
2、退款创建成功的时候会向服务推送主动查询信息,该服务会在一定的时间范围内多次查询渠道直到有明确的结果返回(有些渠道没有异步通知)。
3、转账也是类似的逻辑,但某些渠道只提供重试的功能,要注意幂等性。
……
补偿
协调保证各模块间数据的一致性
一般会跟重试、回滚、兜底来协调使用
使用条件
- 系统异常
- 业务异常
补偿失败报警人工干预
链路监控
展示信息:应用、URL、调用方、调用时间、调用次数、调用失败次数、本地平均耗时、总平均耗时、调用失败平均耗时、错误率、依赖度
关注:Cache、SQL、HTTP、TCP
基本信息:
依赖度:
支付安全
数据安全要点:
- 防窃听 - 防越权
- 防抵赖 - 防破坏
- 防篡改 - 防重放
- 防泄漏
使用范围:网络、系统、应用、业务等
数据安全要点:
加密通讯(防窃听)
双向签名(防抵赖、防篡改)
敏感数据加密存储(防泄漏)
密钥管理(通过认证接口获取,只允许加载到内存,不允许直接写入配置文件)
权限控制(防越权-非法访问)
数据的完整性(放篡改- 数据被恶意修改、非法篡改)
其他
内部接口认证
避免内部代码未经审核发布到托管平台!!!
数据异常分析
安全机构合作
注意点
使用 HTTPS 加密传输
传输的数据使用签名
提交的数据是符合规则并且是不存在或者是未支付的
支付成功以服务端异步通知为准
好啦今天的课程就到这里了,为了方便大家后续的学习,请各位同学做一个小小的课后作业: